%include "macros.asm"
%define src [ebp + 8]
%define dst [ebp + 12]
%define ancho [ebp + 16]
%define alto [ebp + 20]
%define xorder [ebp + 24]
%define yorder [ebp + 28]
%define paso [ebp + 32]


global asmSobel
	
asmSobel:
	C_pushs 0
	
comenzar:

	mov esi, src 			;movemos el puntero al comienzo de la matriz SRC a ESI
	mov edi, dst 			;movemos el puntero al comiendo de la matriz DST a EDI
	
	mov eax,paso 			;muevo a eax el ancho con basura y todo
	mov edx,alto 			;muevo a edx el alto
	
	mul edx					;en eax dejo guardado el ancho por el alto
	mov ecx,eax 			;ahora lo muevo a ECX para hacer un loop que vaya hasta el final
	mov edx,paso			; dejo el paso en edx
	sub ecx,edx 			;la ultima linea no la voy a procesar
	sub ecx,edx 			;la ultima linea no la voy a procesar

	
	cmp dword xorder,1
	je porAhoraX
	jmp Y
	
porAhoraX:
	cmp dword yorder,1
	je XY
	jmp X


X:	
	lea esi,[esi + 1] 			
	lea edi,[edi + 1] 			
	
	xor ebx,ebx					
	xor eax,eax
	
	mov al,[esi -1]
	sub ebx,eax
	
	mov al,[esi+1]
	add ebx,eax
	
	mov al,[esi+edx-1]
	sub ebx,eax
	sub ebx,eax
	
	mov al,[esi+edx+1]
	add ebx,eax
	add ebx,eax
	

	mov al,[esi+edx*2 -1]
	sub ebx,eax
	
	mov al,[esi+edx*2+1]
	add ebx,eax
	

	saturar ebx
			 
	mov [edi + edx],bl 
	
	loop X 
	
	
	mov eax, dst
	mov ebx, alto
	rellenarBordes eax, edx, ebx
	C_pops 0	
	ret



Y:	
	lea esi,[esi + 1] 			
	lea edi,[edi + 1] 			
	
	xor ebx,ebx					 
	xor eax,eax
	
	mov al,[esi -1]
	sub ebx,eax
	
	mov al,[esi]
	sub ebx,eax
	sub ebx,eax
	
	mov al,[esi+1]
	sub ebx,eax
	
	mov al,[esi+edx*2 -1]
	add ebx,eax
	
	mov al,[esi+edx*2]
	add ebx,eax
	add ebx,eax
	
	mov al,[esi+edx*2+1]
	add ebx,eax
	

	saturar ebx
			 
	mov [edi + edx],bl 
	
	loop Y 

	mov eax, dst
	mov ebx, alto
	rellenarBordes eax, edx, ebx
	C_pops 0	
	ret




XY:

	lea esi,[esi + 1] 			
	lea edi,[edi + 1] 			
	
	xor ebx,ebx					
	xor eax,eax
	
	mov al,[esi -1]
	sub ebx,eax
	
	mov al,[esi+1]
	add ebx,eax
	
	mov al,[esi+edx-1]
	sub ebx,eax
	sub ebx,eax
	
	mov al,[esi+edx+1]
	add ebx,eax
	add ebx,eax
	

	mov al,[esi+edx*2 -1]
	sub ebx,eax
	
	mov al,[esi+edx*2+1]
	add ebx,eax
	

	saturar ebx
	
	push ebx
	
	mov al,[esi -1]
	sub ebx,eax
	
	mov al,[esi]
	sub ebx,eax
	sub ebx,eax
	
	mov al,[esi+1]
	sub ebx,eax
	
	mov al,[esi+edx*2 -1]
	add ebx,eax
	
	mov al,[esi+edx*2]
	add ebx,eax
	add ebx,eax
	
	mov al,[esi+edx*2+1]
	add ebx,eax
	

	saturar ebx
	pop eax
	
	add ebx,eax
	saturar ebx
		 
	mov [edi + edx],bl 
	
	dec ecx
	cmp ecx,0
	jg XY

	mov eax, dst
	mov ebx, alto
	rellenarBordes eax, edx, ebx
	C_pops 0	
	ret
